/**
 * @file serial.h
 * @author fwy (2643660853@qq.com)
 * @brief
 * @version 0.1
 * @date 2025-08-15
 *
 * @copyright Copyright (c) 2025
 *
 */

#pragma once

#include <string>
#include <vector>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
#include <sys/select.h>

// 串口通信数据帧结构体
struct SerialData
{
    std::vector<unsigned char> data; // 数据缓冲区

    // 构造空数据帧
    SerialData() {}

    // 使用数据初始化
    SerialData(const std::vector<unsigned char> &d) : data(d) {}

    // 将数据转为可打印的十六进制字符串
    std::string toString() const
    {
        std::string result;
        char buf[4];
        for (unsigned char byte : data)
        {
            snprintf(buf, sizeof(buf), "%02X ", byte);
            result += buf;
        }
        return result;
    }
};

class Serial
{
private:
    int fd;
    std::string devicePath;
    bool isOpen;

    // 配置串口参数
    bool configure(int baudrate, int dataBits, char parity, int stopBits);

public:
    Serial(const std::string &device = "/dev/ttyS6");
    ~Serial();

    // 打开串口
    bool open();

    // 关闭串口
    void close();

    // 写数据
    bool write(const SerialData &data);

    // 读数据，带超时(毫秒)
    SerialData read(int timeout_ms = 1000);

    // 开锁功能 (boardId: 板号, lockId: 锁号)
    bool openLock(int boardId, int lockId);
    // 查询锁状态 (boardId: 板号, lockId: 锁号)
    bool queryLock(int boardId, int lockId);

    // 打开一个板的所有锁
    bool openAllLocks(int boardId);

    // 生成数据帧
    static SerialData buildFrame(int boardId, unsigned char commandId, int lockId);
};
